package top.kaoshanji.p2ch22b;

import java.lang.reflect.Field;

/**
 * 代码清单-p2ch22b-574页a：DI容器类
 * author kaoshanji
 * ^_^
 * create time 2025/3/1 18:04
 */
public class SimpleContainer {

    public <T> T getInstance(Class<T> cls) {
        try {
            T obj = cls.newInstance(); // 创建对象
            Field[] fields = cls.getDeclaredFields(); // 类的字段
            for (Field field: fields) {

                // 获得字段上面的注解，就可以进行自定义逻辑了，故事就是从这里开始

                // 如果该字段上面有 SimpleInject 注解，表示是被注入进来的
                if (field.isAnnotationPresent(SimpleInject.class)) {
                    if (!field.isAccessible()) {
                        field.setAccessible(true);
                    }

                    // 获得字段的类型
                    Class<?> fieldCls = field.getType();

                    // 就需要为该对象的进行设置值（即依赖项），这就是DI的基础操作
                    // 递归调用
                    field.set(obj, getInstance(fieldCls));
                }
            }

            return obj;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }



}
